package tryDefer

import (
	"bufio"
	"fmt"
	"os"
)

type TryDefer struct {
}

func (tryDefer *TryDefer) Error() string {
	return "sd"
}

func witeFail() {
	file, err := os.Create("testgo.out")
	if err != nil {
		panic(err)
	}

	defer file.Close()

	writer := bufio.NewWriter(file)
	defer writer.Flush()

	writer.Write([]byte{34})
}

/**
 	defer特性
	1.确保调用在函数结束时发生：panic抛出的错误，不影响defer最后的执行
	2.参数在defer语句时计算：defer定义的语句传入的变量有变化，会使用当时调用时的值，不是使用变量最终的值
	3.defer列表为后进先出：defer是一个栈，后进先出
*/
func (tryDefer *TryDefer) Print() {
	defer fmt.Println("1")
	defer fmt.Println("2")
	fmt.Println(3)
	witeFail()
	panic("错误了")
	fmt.Println(4)
}
